/*
 * Progetto PPS2012 -seegwords
 *
 * Ettore Chimenti
 * Giuliano De Angelis
 * 
 * @02.2013
 * 
 * 4) Realizzare un mini motore di ricerca, implementato attraverso una lista inversa:
 * http://en.wikipedia.org/wiki/Inverted_index

 * Leggere un insieme di documenti .txt da una directory. Si crei una classe MotoreDiRicerca che 
 * permette di effettuare ricerche efficienti realizzando una lista inversa.
 * In particolare, la classe prende i documenti e crea una la lista inversa:
 * parola->lista_documenti_che_la_contengono

 * Implementare un metodo Search che prende in ingresso una stringa e ritorna un vettore di documenti.
 * In particolare, il metodo Search separa la stringa in un insieme di parole. I documenti ritornati 
 * sono trovati intersecando le liste relative alle parole. 
 * 
 */
#include <iostream>
#include <vector>
#include <string>
#include "./MotoreDiRicerca.h"

using namespace std;

int main( int argc, char *argv[] ){
  
  if (argc == 1){
    cout << argv[0] << ": Missing operands!\n" ;
    cout << "Usage: \n"; 
    cout << argv[0] << " file1 [ file2 file3 ... ] \n" ;
    return 1;
  }
  
  MotoreDiRicerca EG;
  vector<string>  docs;
  vector<string>* docs_results;
  char	 	  delim = '\n' ;
  
  for (int i=1 ; i<argc ; i++) {
    docs.push_back(argv[i]);
  }
  
  if (!EG.Index(docs)){
    cerr << "Error: one or more files are not valid! \n";    
    cerr << "Usage: \n"; 
    cerr << argv[0] << " file1 [ file2 file3 ... ] \n" ;
    return 1;
  }
  
#ifdef VERBOSE
  cout << "Stats:" << "\n ";
  cout << "Arguments provided: " << argc-1 << "\n "; 
  cout << "Words stored: " << EG.GetDbSize() << "\n ";
  cout << "Docs  stored: " << EG.GetDocSize() << "\n ";
  cout << "\n";
  cout << "Search query:" << "\n ";
#endif

  string s;
  getline(cin, s, delim);
  
  docs_results = EG.Search(s);
  
  if (docs_results->size() == 0) {
    cerr << "Nothing found!\n";
    delete docs_results;
    return 2;
  }
  
  cout << " " ;   
  for (unsigned int i=0 ; i<docs_results->size() ; i++) {
    cout << (*docs_results)[i] << "\n ";
  }
  
  delete docs_results;
  
  return 0;
};
